package com.zero2oneblog.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zero2oneblog.entity.UserInfo;
import com.zero2oneblog.service.IUserInfoService;
//import com.zero2oneblog.vo.UserRegisterRequestVO;
import com.zero2oneblog.service.impl.UserJwtServiceImpl;
import com.zero2oneblog.vo.UserInfoRegisterRequestVO;
import com.zero2oneblog.vo.UserRepresentationVO;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.domain.Page;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RestController
//@RequiredArgsConstructor(onConstructor = @__(@Autowired)) //lombok的
//@RequestMapping("/users")
public class UserJwtController {

    @Autowired
    public IUserInfoService userInfoService;

    @Autowired
    public UserJwtServiceImpl userJwtService;

    @PostMapping("/public/sign-up")
    @ApiOperation("用户注册")
    public ResponseEntity<Void> signUp(@RequestBody @Valid UserInfoRegisterRequestVO userInfoRegisterRequestVO) {
//        userInfoService.save(userInfoRegisterRequestVO); //需要重写一下save方法，不是重写，是重载，入参不同？但是MybaitisBlus的形参只有一个，这样能行吗
        userJwtService.save(userInfoRegisterRequestVO);

        return ResponseEntity.ok().build();
    }

    @GetMapping("/public/getAllUser")
    @PreAuthorize("hasAnyRole('ROLE_USER','ROLE_MANAGER','ROLE_ADMIN')")
    @ApiOperation("获取所有用户的信息（分页）")
    public ResponseEntity<IPage<UserInfo>> getAllUser(@RequestParam(value = "pageNum", defaultValue = "0") int pageNum, @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
        IPage<UserInfo> allUser = userJwtService.getAll(pageNum, pageSize);
        return ResponseEntity.ok().body(allUser);
    }

}

/*

@RequiredArgsConstructor(onConstructor = @__(@Autowired)) 是 Lombok 提供的注解，用于自动生成构造函数。
这个注解的作用是生成一个包含所有被 final 修饰的字段的构造函数，并在构造函数参数上自动添加 @Autowired 注解。

具体来说：

@RequiredArgsConstructor 注解会生成一个包含类中所有被 final 修饰的字段的构造函数。
onConstructor 属性用于指定在生成的构造函数上要添加的注解，这里使用 @__(@Autowired) 表示在生成的构造函数上添加 @Autowired 注解。
 */
